package com.tedu.API;

import org.junit.Test;

import java.io.*;
import java.io.FileInputStream;
import java.nio.charset.StandardCharsets;
import java.nio.charset.UnmappableCharacterException;

/**
 * 标准流:IO流处理异常对象
 *
 * 高级流：BufferedOutputStream   写   缓冲输出流
 *        BufferedInputStream   读入
 */
public class IOSAPI {
    /**
     * 缓冲输入流：构造器-->异常对象  具备功能：合理传输数据，效率提高
     * 字符流【转换流】--->解决:缓冲输入流读取单位为字节的问题
     * InputStreamReader 读取的单位：字符
     * OutputStreamWriter 写出单位：字符 调用字符串getBytes写出文本
     *
     * 构造器具备：添加字符集：UTF8万国码
     * new BufferedOutputStream(低级流引用，size:存字节数组【指定】)
     *   问题：1.不能指定字符
     *        2.不能按照字符读取
     */
    @Test
    public void testBIS(){
//        //创建低级流
//        FileInputStream fis=
//                new FileInputStream("bos.txt");
//        //创建高级流---指定字符集--缓冲流不具备功能---新【转换流】
//        BufferedInputStream bis=
//                new BufferedInputStream(fis);
        /**
         * read()----读:一个字节，字节数组--->专门读文字
         */


    }
    /**
     * 针对于缓冲输出/传入功能限定----传输文本
     * 需求：重新写流---针对：文字   写出文本：osw.txt
     */
    @Test
    public void testOSW(){
        //标准流置空流
        FileOutputStream fos=null;
        OutputStreamWriter osw=null;
        //2.捕获异常
        try {
            //创建低级流
//        FileOutputStream fos=null;
            fos= new FileOutputStream("osw.txt");
//        //不考虑效率，只传输文本---字节输出流：输出单位字符形式
//        OutputStreamWriter osw=null;
            osw=new OutputStreamWriter(fos, "UTF8");
            //write() 直接写出文本【不需要转为字节数组】
            osw.write("给孟涛来个666~~~"+File.separator+"n");  //换行：字符:"+File.separator+"n
            osw.write("66666"+File.separator+"n");
            osw.write("8785");
        }catch(FileNotFoundException e){//文件不存在
            e.printStackTrace();
        }catch (UnsupportedEncodingException e){//字符集转换异常
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            //关闭流
            if (osw!=null)
                try {
                    osw.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
        }
    }

    /**
     * 高级流【处理流】---转换流【字符流】，特点：套在低级流上，被其他高级流套上【传输单位字符】
     * 字符输入流  ----单位测试：testISR  读入  文本
     * 字符输出流  -----单元测试 testOSW  写出
     * InputStreamReader    字节输入流  不可以以字符方式读入文本
     *
     * 高级流【处理流】---转换流【字符流】---缓冲字符流：解决读入写出都是字符形式的
     * BufferedReader 缓冲字符读入流----解决：InputStreamReader 读入字节形式
     *                                      BufferedReader读入字符形式
     * BufferedWriter 缓冲字符输入流
     * 需求：ISR字符输入流读取 osw.txt文件 ？？？
     */
    @Test
    public void testISR() {
        //置空流
        FileInputStream fis=null;
        InputStreamReader isr=null;
        //创建低级流和高级流【转换流--字符输入流--读取】
        try {
            fis=new FileInputStream("osw.txt");
            isr=new InputStreamReader(fis,"utf8");

            //读read() 问题 ：读取数据单位：字节，而不是字符
            //               转换流--套高级流：缓冲字符输入流 BufferedReader
            //创建高级流--针对转换流中：字符输入流读取形式：字符的情况---缓冲字符输入流
            BufferedReader br=new BufferedReader(isr);
            /**
             * BufferedReader类
             * readLine() 读取到若干字符串，到换行符为止
             */
            String line=null;
            while((line= br.readLine())!=null){
                System.out.println(" 打印读取到的字符串"+line);
            }
            //region My Custom Region
        }catch (FileNotFoundException e){
            e.printStackTrace();
        }catch (UnsupportedEncodingException e){
            e.printStackTrace();
        }
        catch (IOException e) {
            e.printStackTrace();
        } finally {
        }
        //endregion,

    }
    // 作业2：BufferedReader 读取ISOAPI.java文件--所有代码写出到控制台
    @Test
    public void testHomeWork2(){
        //创建低级流
        FileInputStream fis=null;
        //创建高级流
        InputStreamReader isr=null;
        //缓冲字符流
        BufferedReader br=null;
        //region My Custom region
        try {
            fis=new FileInputStream("src" +
                    ""+File.separator+"main" +
                    ""+File.separator+"java" +
                    ""+File.separator+"com"+File.separator+"tedu" +
                    ""+File.separator+"API"+File.separator+"IO" +
                    ""+File.separator+"IOAPI.java");
            isr=new InputStreamReader(fis,"utf8");
            br=new BufferedReader(isr);
            //读取
            String line=null;
            while((line=br.readLine())!=null){
                System.out.println(""+line);
            }
        }catch(FileNotFoundException e){
            e.printStackTrace();
        } catch(UnsupportedEncodingException e){
            e.printStackTrace();
        }
        catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (br!=null)
                try {
                    br.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            if (isr!=null)
                try {
                    isr.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
        }
        //endregion
    }

    /**
     * 高级流：
     * BufferedWriter---低配版本的输出流【缓冲输出流】
     * PrintWriter ---- 高配版本输出流【字符输出流】
     * 1.一般的高级流不能直接创建----直接创建【PrintWriter不需要创建低级流】---封装
     * 2.封装内存所有流的特点
     * 需求：写出文件pw.txt---文本内容，需要指定编码集utf8
     *
     */
    @Test
    public void testPW() throws FileNotFoundException, UnsupportedEncodingException {
       //创建高级流,低级输出流+转换流+缓冲流
        //region my custom region PrintWriter=低级输出流+转换流+缓冲流
         //低级流：输出流
        FileOutputStream fos=new FileOutputStream("pw.txt");
        //转换流
        OutputStreamWriter osw=new OutputStreamWriter(fos,"utf8");
        //缓冲流
        BufferedWriter bw=new BufferedWriter(osw);
        //endregion
       PrintWriter pw=new PrintWriter("pw.txt","UTF8");
       //写出功能:print()打印一行文本不换行  println()打印一行文本换行
        pw.print("给孟涛来个666~~~");
        pw.println("8785");
        pw.close();
    }

}
